package process

import (
	"../../common/message"
	"../../common/utils"
	"../model"
	"encoding/json"
	"fmt"
	"net"
)

type UserProcess struct {
	Conn   net.Conn
	UserId int
}

func (obj *UserProcess) ServerProcessLogin(msg *message.Message) (err error) {

	var loginMes message.LoginMes

	err = json.Unmarshal([]byte(msg.Data), &loginMes)
	if err != nil {
		fmt.Println("json unmarshal error =", err)
		return
	}

	var resMes message.Message
	resMes.Type = message.LoginResMesType

	var loginResMes message.LoginResMes

	_, err = model.MyUserDao.Login(loginMes.UserId, loginMes.UserPwd)
	if err != nil {

		if err == model.ERROR_USER_NOTEXISTS {
			loginResMes.Code = 500
			loginResMes.Error = err.Error()
		} else if err == model.ERROR_USER_EXISTS {
			loginResMes.Code = 403
			loginResMes.Error = err.Error()
		} else {
			loginResMes.Code = 505
			loginResMes.Error = "服务器内部错误"
		}
	} else {
		loginResMes.Code = 200

		// 添加在线用户
		obj.UserId = loginMes.UserId
		userMgr.AddOnlineUser(obj)
		obj.NotifyOtherUserOnline(loginMes.UserId)

		// 返回数据添加在线用户id
		for id, _ := range userMgr.onlineUsers {
			loginResMes.UserIds = append(loginResMes.UserIds, id)
		}
	}

	data, err := json.Marshal(loginResMes)
	if err != nil {
		fmt.Println("json Marshal error =", err)
		return
	}

	resMes.Data = string(data)
	data, err = json.Marshal(resMes)

	if err != nil {
		fmt.Println("json Marshal error =", err)
		return
	}

	tf := &utils.Transfer{
		Conn: obj.Conn,
	}

	err = tf.WritePkg(data)

	if err != nil {
		fmt.Println("writePkg error =", err)
		return
	}

	return
}

func (obj *UserProcess) ServerProcessRegister(msg *message.Message) (err error) {

	var registerMes message.RegisterMes

	err = json.Unmarshal([]byte(msg.Data), &registerMes)
	if err != nil {
		fmt.Println("json unmarshal error =", err)
		return
	}

	var resMes message.Message
	resMes.Type = message.RegisterMesType

	var registerResMes message.RegisterResMes

	err = model.MyUserDao.Register(&registerMes.User)
	if err != nil {

		if err == model.ERROR_USER_EXISTS {
			registerResMes.Code = 505
			registerResMes.Error = err.Error()
		} else {
			registerResMes.Code = 506
			registerResMes.Error = "注册时发生未知错误"
		}
	} else {
		registerResMes.Code = 200
	}

	data, err := json.Marshal(registerResMes)
	if err != nil {
		fmt.Println("json Marshal error =", err)
		return
	}

	resMes.Data = string(data)
	data, err = json.Marshal(resMes)

	if err != nil {
		fmt.Println("json Marshal error =", err)
		return
	}

	tf := &utils.Transfer{
		Conn: obj.Conn,
	}

	err = tf.WritePkg(data)

	if err != nil {
		fmt.Println("writePkg error =", err)
		return
	}

	return
}

func (obj *UserProcess) NotifyOtherUserOnline(userId int) {
	userMap := userMgr.GetAllOnlineUser()

	for id, up := range userMap {
		if id == userId {
			continue
		}
		up.NotifyMeOnline(userId)
	}
}

// NotifyMeOnline 发送上线消息
func (obj *UserProcess) NotifyMeOnline(userId int) {

	var resMes message.Message
	resMes.Type = message.UserStatusNotifyMesType

	var userStatusNotifyMes message.UserStatusNotifyMes
	userStatusNotifyMes.UserId = userId
	userStatusNotifyMes.Status = message.UserOnline

	data, err := json.Marshal(userStatusNotifyMes)
	if err != nil {
		fmt.Println("json.Marshal userStatusNotifyMes err=", err)
		return
	}

	resMes.Data = string(data)

	data, err = json.Marshal(resMes)
	if err != nil {
		fmt.Println("json.Marshal resMes err=", err)
		return
	}

	tf := &utils.Transfer{
		Conn: obj.Conn,
	}

	err = tf.WritePkg(data)
	if err != nil {
		fmt.Println("tf write pkg err=", err.Error())
		return
	}

	return
}
